import pandas as pd
import numpy as np
import matplotlib.pyplot  as plt
from statsmodels.tsa.arima.model import  ARIMA
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from pylab import mpl
from statsmodels.tsa .stattools import  adfuller

mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']  #指定默认字体
mpl.rcParams['axes.unicode_minus'] = False             #解决保存图像是负号‘-’显示为方块的问题

#=====================================
#1.数据加载和预处理
#=====================================

#1.1创建中国宠物食品生产值的数据（亿元）
production_data ={
    'year':[2019,2020,2021,2022,2023],
    'production_value':[440.7,727.3,1554,1508,2793]
}

df_production = pd.DataFrame(production_data)

#1.2创建出口的数据（亿元）
export_data = {
    'year':[2019,2020,2021,2022,2023],
    'export_value':[154.1,9.8,12.2,24.7,39.6]
}

df_export = pd.DataFrame(export_data)
#1.3合并生产值和出口数据
df = pd.merge(df_production,df_export,on='year')

#1.4 添加其他影响因素的数据
#国内需求指数
#国际市场的需求指数
#人民币与美元的汇率
additional_data = {
    'year':[2019,2020,2021,2022,2023],
    'domestic_demand':[1.2,1.3,1.5,1.6,1.7],
    'global_demand':[1.1,1.2,1.3,1.4,1.5],
    'exchange_rate':[6.9,7.0,6.8,6.7,6.6]
}

df_additional = pd.DataFrame(additional_data)

#1.5合并所有数据
df_full = pd.merge(df,df_additional,on='year')

#查看完整的数据集
print("完整的数据集：")
print(df_full)
print("\n")

#===============================
#2时间序列预测（ARIMA模型）-预测生产值
#==================================
result = adfuller(df_full['production_value'])
print("生产值时间序列的ADF检验结果：")
print(f"ADF Statistic:{result[0]}")
print(f"p-value:{result[1]}")
print("\n")

if result[1] > 0.05:
    df_full['production_value_diff'] = df_full['production_value'].diff().dropna()
    #再次进行ADF检验
    result_diff = adfuller(df_full['production_value_diff'].dropna())
    print("差分后的生产时间序列的ADF检验结果：")
    print(f"ADF Statistic:{result_diff[0]}")
    print(f"p-value:{result_diff[1]:.6f}")
    print("\n")
    d = 1     #差分阶数为1
else:
    d = 0     #数据是平稳的

#2.2 使用ARIMA模型进行预测
#选择p和q，可以使用自相关图和偏自相关图（这里是为了简化）
p = 1
q = 1
model = ARIMA(df_full['production_value'],order=(p,d,q))
model_fit = model.fit()

#2.3预测未来三年的生产值
forecast_step = 3
forecast  = model_fit.forecast(steps=forecast_step)
forecast_years = [2024,2025,2026]

#2.4 打印测试结果
print("未来三年生产值预测（亿元）")
for year,value in zip(forecast_years,forecast):
    print(f"{year}:{value:.2f}")
print("\n")

#2.5绘制实际值与预测值
plt.figure(figsize=(12,6))
plt.plot(df_full['year'],df_full['production_value'],label='历史生产值',marker='o')
plt.plot(forecast_years,forecast,label='预测生产值',marker='o',linestyle='--')
plt.xlabel('年份')
plt.ylabel('生产值（百万人民币）')
plt.title('中国宠物食品生产值预测（ARIMA模型）')
plt.legend()
plt.grid(True)
plt.show()


#====================================
#3.多元回归线性模型--预测出口值
#====================================

#3.1准备特征变量 X 和目标变量Y
X= df_full[['production_value','domestic_demand','global_demand','exchange_rate']]
Y= df_full['export_value']

#3.2创建并训练线性回归模型
regressor = LinearRegression()
regressor.fit(X,Y)

#3.3打印回归系数
print("回归模型系数：")
coefficient = pd.DataFrame({
    'Feature':['production_value','domestic_demand','global_demand','exchange_rate'],
    'Coefficient':regressor.coef_
})
print(coefficient)
print(f"截距（Intercept）:{regressor.intercept_}")
print("\n")

#3.4准备未来三年的特征数据（假设数据）
future_data = pd.DataFrame({
    'production_value':forecast.values,   #使用预测的生产值
    "domestic_demand":[1.8,1.9,2.0],                #假设未来国内需求指数
    'global_demand':[1.6,1.7,1.8],                  #假设未来全球需求指数
    'exchange_rate':[6.5,6.4,6.3]                   #假设的未来汇率（人民币兑美元）
})

#3.5 预测未来三年的出口值
export_forecast = regressor.predict(future_data)

print("未来三年出口值预测（亿元）")
for year,value in zip(forecast_years,export_forecast):
    print(f"{year}:{value:.2f}")
print("\n")

#===================================
#4.系统动力学模型----外部经济政策影响
#===================================

#4.1 定义关税影响的模型
class PolicyImpactModel:
    def __init__(self,initial_export_value):
        self.export_value = initial_export_value    #初始出口值
        self.tariff_rate = 0.0                      #初始关税

    def apply_tariff(self,tariff_increase):
        """关税增加会影响出口值"""
        self.tariff_rate += tariff_increase
        self.export_value *= (1-tariff_increase/100)       #关税提升影响出口值

    def get_export_value(self):
        return self.export_value

#4.2 模拟未来三年关税变化对出口值的影响
#使用预测2024年出口值作为初始值
policy_model = PolicyImpactModel(initial_export_value=export_forecast[0])

#假设2024年和2025年欧盟和美国分别增加5%和10%的关税
tariff_changes = [0.05,0.10,0.00]        #2024年增加5%，2025年增加20%，2026年不变
adjusted_exports = []
for i,tariff in enumerate(tariff_changes):
    policy_model.apply_tariff(tariff)
    adjusted_export = policy_model.get_export_value()
    adjusted_exports.append(adjusted_export )
    print(f"{forecast_years[i]}年出口值（关税增加{tariff *100}%后的影响），{adjusted_export:.2f}亿元")

#=======================================
#结果汇总与分析
#=======================================

#5.1 汇总预测分析
prediction_summary = pd.DataFrame({
    'Year':forecast_years,
    'predicted_production_value':forecast.values,
    'predicted_export_value':export_forecast,
    'adjusted_export_value': adjusted_exports
})

print("\n预测结果汇总：")
print(prediction_summary)

#5.2 绘制预测的生产值和出口值（调整前后）
plt.figure(figsize=(12,6))
plt.plot(df_full['year'],df_full['production_value'],label='History',marker='o')
plt.plot(forecast_years,forecast,label='Forecast',marker='o',linestyle='--')
plt.xlabel('year')
plt.ylabel('Forecast of pet Food Production Value in China')
plt.title("Forecast of pet Food Production Value in China")
plt.legend()
plt.grid(True)
plt.show()

plt.figure(figsize=(12,6))
plt.plot(df_full['year'],df_full['export_value'],label='History',marker='o')
plt.plot(forecast_years,export_forecast ,label='Forecast Production Value (unadjusted)',marker='o',linestyle='--')
plt.plot(forecast_years,adjusted_exports ,label='Forecast Production Value (after tariff effects)',marker='o',linestyle='--')
plt.xlabel('year')
plt.ylabel('Value of exports(billion yuan)')
plt.title("Forecast of Pet Food Export Value in China")
plt.legend()
plt.grid(True)
plt.show()